//
//  AuthViewModel.swift
//  新浪微博项目
//
//  Created by 王炯 on 16/7/22.
//  Copyright © 2016年 王炯. All rights reserved.
//

import UIKit

//ViewController中请求网络授权和请求网络数据全部搬迁到ViewModel类中来管理
//ViewModel类属于一种工具类，用于处理Controller中的一些数据处理操作
class AuthViewModel: NSObject
{
 
    //工具类，声明一个单例对象
    static let AuthViewModelTools:AuthViewModel = AuthViewModel()
    


    
    
    
    
    // 创建一个用户模型
    var userModel: TokenModel?
    
    override init() {
        super.init()
        
        //单例对象一初始化时就先从本地获取到有没有归档的数据存在，防止以后重复获取本地数据
        userModel = GetViewModelData()
        
    }
    
    
    
    //(1)-设置accessToken属性(计算属性，需要时刻根据外面的信息来判断其属性值)
    var accessToken:String?{
        
        //当用户模型里面有accessToken时
        if userModel?.access_token != nil
        {
            // 看是否过期
            // 当前保存的日期与当前日期对比 如果为降序 为未过去
            if userModel?.expires_Date?.compare(NSDate()) == NSComparisonResult.OrderedDescending
            {
                
                //表示没有过期，正常返回
                return userModel?.access_token
            }
            else
            {
                //表示已经过期
                return nil
            }
            
        }
        else
        {
            // 代表没有acceToken
            /*
             - 代表用户没有登录 或者没有保存数据
             */
            return nil
        }
    }
    
    //(2)通过accessToken属性来判断用户有没有登录
    var isLogin:Bool{
        
        let isLog = (accessToken != nil)
        
        return isLog
    }
    
    
}

//ViewModel管理类的作用1:请求网络授权和网络用户信息
extension AuthViewModel
{
    //请求accessToken获取授权
    func GetAccessToken(code:String,isSuccess:(isSucc: Bool)->())
    {
        //使用单例属性
        let netTools:WeiBoNetWorkTool = WeiBoNetWorkTool.sharedTools
        
        //使用单例netTools的请求accessToken方法
        netTools.POSTAccessToken(code, success: { (response) in
            
            
            //强制将result转换成字典
            guard let r = response as? [String:AnyObject] else
            {
                //请求失败时返回给Controller返回失败信息
                isSuccess(isSucc: false)
                
                print("请求token数据失败")
                
                return
            }
            
            //字典转模型
            let model:TokenModel = TokenModel(dict: r)
            
            
            //获取用户信息
            self.GetUserInfo(model,isSuccess:isSuccess)
            
            
        }) { (error) in
            
            
            //请求失败时返回给Controller返回失败信息
            isSuccess(isSucc: false)
            
            print("请求token失败")
            
        }
    }
    
    
    //根据token获取用户的基本信息
    func GetUserInfo(model:TokenModel,isSuccess:(isSucc: Bool)->())
    {
        //使用单例属性
        let netTools:WeiBoNetWorkTool = WeiBoNetWorkTool.sharedTools
        
        //使用单例的GETUserInfo来获取用户信息
        netTools.GETUserInfo(model, success: { (response) in
            
            
            
            //将数据装换成字典
            guard let r = response as? [String:AnyObject] else
            {
                
                //请求失败时返回给Controller返回失败信息
                isSuccess(isSucc: false)
                
                print("请求用户信息失败")
                
                return
            }
            
            
            /*
             let rDict:NSDictionary = r as NSDictionary
             
             NSLog("%@",rDict)
             */
            
            
            //将用户名和用户头像地址添加到当前model下
            model.screen_name = r["screen_name"] as? String
            
            model.avatar_large = r["avatar_large"] as? String
            
            //获取到了正确的网络信息
            print(model)
            
            //将从网上获取到的正确的网络信息归档
            self.SaveViewModelData(model)
            
            //告诉controller我已经成功获取到了用户的信息了(因为isSucc默认是false)
            isSuccess(isSucc: true)
            
        }) { (error) in
            
            //请求失败时返回给Controller返回失败信息
            isSuccess(isSucc: false)
            
            print("请求用户失败")
        }
    }
}

//ViewModel管理类的作用2:网络数据的归档与解档
extension AuthViewModel
{
    //归档网络数据
    func SaveViewModelData(model:TokenModel)
    {
        //归档之前，先把本地的userModel更新成获取的网络数据
        //解决第一次userModel为nil的bug
        self.userModel = model
        
        //归档方法
        NSKeyedArchiver.archiveRootObject(model, toFile:kKeyedArchiverFilePath)
    }
    
    //解档网络获取的数据
    func GetViewModelData() ->TokenModel?
    {
        //解档方法
      let ModelResult = NSKeyedUnarchiver.unarchiveObjectWithFile(kKeyedArchiverFilePath) as? TokenModel
        
       return ModelResult
    }
    
}
